//#include<stdio.h>
//int main()
//{
//	int a = 10;
//	int* p =&a;
//	*p = 20;
//	printf("%d",a);
//	
//	
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	printf("%d\n",sizeof(int*));
//	printf("%d\n",sizeof(char*));
//	printf("%d\n",sizeof(float*));
//	printf("%d\n",sizeof(double*));
//}

//#include <stdio.h>
//int main()
//{
//	int n = 0x11223344;
//	char *pi = &n;
//	*pi = 0;
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int n =10;
//	int* pi = &n;
//	char* ph = &n;
//	printf("%p\n",&n);
//	printf("%p\n",pi);
//	printf("%p\n",pi+1);
//	printf("%p\n",ph);
//	printf("%p\n",ph+1);
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	const int a = 10;
//    int * p =&a;
//	*p = 20;
//	
//	printf("%d",a);
//	
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	int a = 10;
//	int * const p = &a;
//	//int b = 10;
//	//p = &b;
//	* p =20;
//	printf ("%d",a);
//	
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int a = 10;
//	int const *  p = &a;
//	int b = 30;
//	//*p = 20;//err
//	p = &b;
//	
//	printf ("%d",*p);
//	
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int arr[] = {0,1,2,3,4,5,6,7,8,9};
//	int *p =arr;
//	int sz = sizeof(arr)/sizeof (arr[0]);
//	for (int i = 0; i< =sz ;i++)
//	{
//		printf("%d\n",*(p+i));
//	}
//	
//	
//	return 0;
//}

//int * test()
//{
//	int a =0;
//	return &a;
//}
//
//
//int main()
//{
//	int* p = test()
//	
//	return 0;
//}


//int main()
//{
//	int a = 10;
//	int *pa = &a;//整形指针
//	char c = 'w';
//	char * pc = &c;//字符指针
//	
//	int arr[10]={0};
//	//&arr 取出的是数组的地址
//	//arr 取出的是首元素的地址
//	
//	
//	return 0;
//}

//int main ()
//{
//	int arr[10]={0};
//	int (*p)[10]=&arr;
//	
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10]={0,1,2,3,4,5,6,7,8,9};
//	int (*p)[10] = &arr;
//	for (int i = 0; i <10;i++)
//	{
//		
//		printf("%d\n",(*p)[i]);//& 和 *可相互抵消 ，所以*&arr == arr
//	}
//	
//	
//	return 0;
//	
//}
//#include<stdio.h>
//void test(int(*arr)[5],int r,int c)
//{
//	for(int i = 0;i < r ;i++)
//	{
//		for ( int j = 0;j< c; j++)
//		{
//			printf("%d",*(*(arr+i)+j));
//		}
//		printf("\n");
//		
//	}
//	
//}
//
//
//
//int main()
//{
//	int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
//	test(arr, 3, 5);
//	return 0;
//}
//#include<stdio.h>
//void test1 ()
//{
//	printf("hehe\n");
//}
//
//void(*p)() =test1;
//void(*p)() = &test1;
//
//int test2 (int a, int b)
//{
//	return a+b;
//}
//int(*p)(int,int) = test2;
//int (*p)(int a,int b) = test2;//a和b可以省略
////int main()
////{
////	printf("test = %p\n",test);
////	printf("&test = %p\n",&test);
////	
////	
////	return 0;
////}


//#include<stdio.h>
//
//int add (int x, int y)
//{
//	return x+y;
//}
//
//int main()
//{
//	int (*pa)(int,int)=add;
//	int c =add(2,3);//函数名调用
//	printf("%d\n",c);
//	
//	int d =(*pa)(2,5);//函数指针调用
//	printf("%d\n",d);
//	
//	printf("%d\n",pa(2,5));//函数指针调用
//	
//	return 0;
//}

//typedef int* x;
//int main()
//{
//	x p1;
//	
//	int* p2;
//	return 0;
//}


//typedef int (*ptr) (int ,int );//正确
//
//typedef int (*)(int,int ) ptr//错误
////数组变量也一样我们需要把新的类型名放在*号的右边
//typedef int (*pst)[5];

//void (*signal(int , void(*)(int)))(int);
//typedef void(*pst)(int);
//pst signal(int,pst);

//typedef int* p1;
//#define p2 int*;
//
//p1 a,b;//a和b都是int*类型的
//
//p2 c,d;//c是int*类型的，d是int类型的
//int*c,d;//*给c了
int add(int x,int y)
{
	return x+y;
}
int sub(int x,int y)
{
	return x-y;
	
}
int mul(int x,int y)
{
	return x*y;
}
int div(int x,int y)
{
	return x/y;
}

//int main()
//{
//	int (*pf)(int,int)=add;//pf是函数指针变量
//	int (*pfarr[4])(int,int)={add,sub,mul,div};//pfarr是函数指针数组
//	
//	return 0;
//}
//#include<stdio.h>
//int main()
//{
//	
//	
//	 int input,x,y,ret;
//	do{
//	   printf("*********************\n");
//		printf("**1.add      2.sub **\n");
//		printf("**3.mul      4.div **\n");
//		printf("*******0.exit********\n");
//		printf("*********************\n");
//		scanf("%d",&input);
//		switch (input) {
//		case 1:
//		
//			scanf("%d %d",&x,&y);
//			ret =add(x,y);
//			printf("%d\n",ret);
//			break;
//		case 2:
//			
//			scanf("%d %d",&x,&y);
//			ret =sub(x,y);
//			printf("%d\n",ret);
//			break;
//		case 3:
//			
//			scanf("%d %d",&x,&y);
//			ret =mul(x,y);
//			printf("%d\n",ret);
//			break;	
//		case 4:
//			
//			scanf("%d %d",&x,&y);
//			ret =div(x,y);
//			printf("%d\n",ret);
//			break;
//		case 0:
//			printf("退出程序\n");
//		default:
//			printf("不在范围\n");
//			break;
//		}
//		
//	}while(input!=0);
//	
//	return 0;
//}



//#include<stdio.h>
//int main()
//{
//	
//	
//	int input,x,y,ret;
//	int (*p[])(int,int)={0,add,sub,mul,div};
//	do{
//		printf("*********************\n");
//		printf("**1.add      2.sub **\n");
//		printf("**3.mul      4.div **\n");
//		printf("*******0.exit********\n");
//		printf("*********************\n");
//		scanf("%d",&input);
//		if(input>=1&&input<=4)
//		{
//		scanf("%d %d",&x,&y);
//		ret = p[input](x,y);
//		printf("%d\n",ret);
//		}
//		else if(input==0)
//		{
//			printf("退出程序");
//		}
//		else
//		{
//			printf("输入错误");
//		}
//		
//	}while(input!=0);
//	
//	return 0;
//}


#include<stdio.h>
void calc(int(*p)(int,int))
{
	int x,y,ret;
	scanf("%d %d",&x,&y);
	ret =p(x,y);
	printf("%d\n",ret);
	
}
int main()
{
	
	
	 int input;
	do{
	   printf("*********************\n");
		printf("**1.add      2.sub **\n");
		printf("**3.mul      4.div **\n");
		printf("*******0.exit********\n");
		printf("*********************\n");
		scanf("%d",&input);
		switch (input) {
		case 1:
		    calc(add);
			break;
		case 2:
			calc(sub);
			break;
		case 3:
			calc(mul);
			break;	
		case 4:
			calc(div);
			break;
		case 0:
			printf("退出程序\n");
		default:
			printf("不在范围\n");
			break;
		}
		
	}while(input!=0);
	
	return 0;
}
